package thread.threadpool.example1;


import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * Description: 自定义线程池
 *              成员属性：
 *                  1、需要集合容器，用来存储任务队列，需要保线程安全
 *                  2、需要当前线程数
 *                  3、需要核心线程数
 *                  4、需要最大线程数
 *                  5、任务队列长度
 *              成员方法：
 *                  1、提交任务，提交后会存入任务队列
 *                  2、执行任务，将一个一个的执行任务
 * date: 2022/11/18 10:35
 * @author: Huangjunjie
 * @since JDK 1.8
*/
public class MyThreadPool {

    //定义集合容器
    private List<Runnable> tasks = Collections.synchronizedList(new LinkedList<>());
    //定义属性记录当前线程数
    private int number;
    //定义属性，记录核心线程数
    private int corePoolSize;
    //定义属性，记录最大线程数
    private int maxSize;
    //定义属性，记录任务队列长度
    private int workSize;

    //定义一个构造方法，用于传参
    public MyThreadPool(int corePoolSize,int maxSize,int workSize){
        this.corePoolSize = corePoolSize;
        this.maxSize = maxSize;
        this.workSize = workSize;
    }

    //提交任务的方法
    public void submit(Runnable r){
        //判断当前集合任务的数量是否超过了最大任务数量
        if(tasks.size() >= workSize){
            System.out.println("任务："+r+"被丢弃了");
        }else{
            //添加到队列中
            tasks.add(r);
            //执行任务
            executeTask(r);
        }
    }
    //执行任务
    public void executeTask(Runnable r){
        //判断线程池中的线程数量有没有超过核心线程数
        if(number <= corePoolSize){
            //创建核心线程进行执行任务
            new MyWorker("核心线程："+number,tasks).start();
            number++;
        }else if(number < maxSize){
            //超过了核心线程数，创建非核心线程数进行执行
            new MyWorker("非核心线程"+number,tasks).start();
            number++;
        }else{
            System.out.println("任务"+r+"被缓存了");
        }

    }
}
